package br.com.divulgaqui.service;

import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.logging.Logger;

import br.com.divulgaqui.client.PessoaFisicaServiceBeanLocal;
import br.com.divulgaqui.client.exception.CPFIgualException;
import br.com.divulgaqui.client.exception.EmailIgualException;
import br.com.divulgaqui.entity.Endereco;
import br.com.divulgaqui.entity.Pessoa;
import br.com.divulgaqui.entity.PessoaFisica;
import br.com.divulgaqui.entity.Telefone;
import br.com.divulgaqui.persistence.dao.EnderecoDAO;
import br.com.divulgaqui.persistence.dao.PessoaFisicaDAO;
import br.com.divulgaqui.persistence.dao.TelefoneDAO;
import br.com.divulgaqui.persistence.daoimpl.EnderecoDAOimpl;
import br.com.divulgaqui.persistence.daoimpl.PessoaDAOImpl;
import br.com.divulgaqui.persistence.daoimpl.PessoaFisicaDAOImpl;
import br.com.divulgaqui.persistence.daoimpl.TelefoneDAOimpl;
import br.com.divulgaqui.util.Util;

/**
 * Session Bean implementation class PessoaFisicaServiceBean
 */
@Stateless
public class PessoaFisicaServiceBean extends PessoaServiceBean implements PessoaFisicaServiceBeanLocal {

	@PersistenceContext(unitName="divulgaqui")
	private EntityManager entityManager;
	private PessoaFisicaDAO pessoaFisicaDAO;
	private TelefoneDAO telefoneDAO;
	private EnderecoDAO enderecoDAO;
	private Logger logg = Logger.getLogger(PessoaFisicaServiceBean.class);
	
	/**
	 * Default constructor.
	 */
	public PessoaFisicaServiceBean() {

	}

	@PostConstruct
	void init() {
		super.init();
		pessoaFisicaDAO = new PessoaFisicaDAOImpl(this.entityManager);
		telefoneDAO = new TelefoneDAOimpl(this.entityManager);
		enderecoDAO = new EnderecoDAOimpl(this.entityManager);
		pessoaDAO = new PessoaDAOImpl(entityManager);
	}

	@Override
	public void salvar(PessoaFisica pessoaFisica)throws EmailIgualException, CPFIgualException {
		validaPessoaFisica(pessoaFisica);
		pessoaFisica.setCpf(pessoaFisica.getCpf().replace("-", "").replace(".", "").trim());
		pessoaFisica.setEmail(pessoaFisica.getEmail().toLowerCase());
		List<Telefone> tels = pessoaFisica.getTelefones();
		Set<Endereco> ends = pessoaFisica.getEnderecos();
		pessoaFisicaDAO.salvar(pessoaFisica);
		pessoaFisica = pessoaFisicaDAO.getByCPF(pessoaFisica.getCpf());
		if (tels != null && !tels.isEmpty()) {
			for (Telefone tel : tels) {
				tel.setPessoa(pessoaFisica);
				telefoneDAO.salvar(tel);
			}
		}
		if (ends != null && !ends.isEmpty()) {
			for (Endereco end : ends) {
				end.setPessoa(pessoaFisica);
				enderecoDAO.salvar(end);
			}
		}
		logg.debug("Pessoa Física '" + pessoaFisica.getNome() + "' salva");
	}
	

	protected void validaPessoaFisica(PessoaFisica pessoaFisica) throws EmailIgualException, CPFIgualException {
		if (pessoaFisica == null) {
			throw new IllegalArgumentException("Parametro não pode ser nulo");
		}
		super.validaPessoa(pessoaFisica);
		PessoaFisica pessoaFisicaIgual = null;
		pessoaFisicaIgual = pessoaFisicaDAO.getByCPF(pessoaFisica.getCpf());
		if (pessoaFisica != null && pessoaFisica.getId() != null && !pessoaFisica.getId().equals(pessoaFisicaIgual.getId())) {
			//TODO: colcoar msg no propeties
			throw new CPFIgualException("CPF: '"+pessoaFisica.getCpf()+ "' já cadastrado no sistema.");
		}
		
	}
	
	public void alterarCascade(PessoaFisica pessoaFisica) throws EmailIgualException, CPFIgualException{
		pessoaFisicaDAO.atualizar(pessoaFisica);
		if (pessoaFisica.getTelefones() != null && !pessoaFisica.getTelefones().isEmpty()) {
			for (Telefone tel : pessoaFisica.getTelefones()) {
				if (Util.isEmpty(tel.getId())) {
					tel.setPessoa(pessoaFisica);
					telefoneDAO.salvar(tel);
				}
				else {
					telefoneDAO.atualizar(tel);
				}
			}
		}
		
	}
	
	public Set<PessoaFisica> recuperarTodasAsPessoas(){
		return pessoaFisicaDAO.recuperarTodasAsPessoas();
	}
	public Set<Telefone> getTelefoneByPessoaFisica(Pessoa pessoa){
		return telefoneDAO.getTelefonesByPessoaId(pessoa);
	}
	@Override
	public List<PessoaFisica> listar(PessoaFisica pessoaFisica){
		return pessoaFisicaDAO.listar(pessoaFisica);
	}
	public void atualizarPessoaFisica(PessoaFisica pessoaFisica){
		if (Util.isEmpty(pessoaFisica.getId())) {
			throw new IllegalArgumentException("ID requerido");
		}
		else {
			pessoaFisicaDAO.atualizar(pessoaFisica);
		}
	}
	
	public PessoaFisica pesquisarPorCPF(PessoaFisica pf){
		return pessoaFisicaDAO.getByCPF(pf.getCpf());
	}
	
}
